Skip to content

在 Docker 容器中部署

在 Docker 容器中部署 PostgreSQL

启动一个 PostgreSQL 实例

```sh
$ sudo docker run -d -p 5432:5432 --name postgres-1 -e POSTGRES_PASSWORD=postgres postgres
```

在 Docker 容器中部署 Logstash

启动一个 Logstash 实例

  • 拉取 Logstash 镜像

    sh
    $ docker pull docker.elastic.co/logstash/logstash:7.16.1
  • Pipeline 配置

    将管道配置放在 Logstash 能够找到的地方是非常重要的。默认情况下,容器将在 /usr/share/logstash/pipeline/ 中查找管道配置文件。

    在这个例子中,我们使用一个绑定挂载的卷通过 docker run 命令来提供配置:

    sh
    $ docker run -it -v $HOME/pipeline/:/usr/share/logstash/pipeline/ docker.elastic.co/logstash/logstash:7.16.1

    Logstash 将主机目录 $HOME/pipeline/ 中的每个文件解析为管道配置。

  • 设置

    通过绑定挂载提供设置文件。Logstash 希望在 /usr/share/logstash/config/ 找到它们。

    可以提供一个包含所有所需文件的完整目录:

    sh
    $ docker run -it -v $HOME/settings/:/usr/share/logstash/config/ docker.elastic.co/logstash/logstash:7.16.1

    或者,单个文件也可以挂载:

    sh
    $ docker run -it -v $HOME/settings/logstash.yml:/usr/share/logstash/config/logstash.yml docker.elastic.co/logstash/logstash:7.16.1
    tip
    绑定挂载的配置文件将在容器中保留它们在主机系统上拥有的相同权限和所有权。确保设置权限,使文件能够被容器的日志存储用户(UID 1000)读取,理想情况下,文件不能被写入。

在 Docker 容器中部署 Redis

启动一个 Redis 实例

```sh
$ docker run -d -p 6379:6379 --name redis-1 redis redis-server --requirepass password
```

在 Docker 容器中部署 Nexus

启动一个 Nexus 实例

```sh
$ docker run -d -p 8081:8081 --name nexus sonatype/nexus3
```

在 Docker 容器中部署 Jenkins

启动一个 Jenkins 实例

```sh
$ docker run -d -p 18080:8080 --name jenkins jenkins/jenkins:lts-jdk11
```

Jenkins 容器使用宿主机的 Docker

sh
$ docker run -d -u root -p 18080:8080 -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -v /etc/docker:/etc/docker --name jenkins jenkins/jenkins:lts-jdk11
  • -v /var/run/docker.sock:/var/run/docker.sock - 通过映射主机的套接字文件到容器,让容器内启动 Docker 的时候并不是启动容器内的容器(子容器),而是启动宿主机上的容器(兄弟容器)。

  • -v /usr/bin/docker:/usr/bin/docker - 让容器中直接使用宿主机的 Docker 客户端。

  • -v /etc/docker:/etc/docker - 让容器中的 Docker 客户端使用宿主机的 Docker 配置文件, 包括国内镜像 (mirrors) 和 非 SSL 安全访问白名单 等配置。

解决访问宿主机 docker.sock 的权限问题

启动容器后, 我们通过 docker exec -it jenkins /bin/bash 命令进入容器, 执行 docker ps 验证 docker 命令是否可正常使用, 结果发现会遇到如下权限问题:

sh
jenkins@79366bf746bd:/$ docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied

解决方案:

启动容器时使用 -u root 选项。

在 Docker 容器中部署 Maven

在 Maven 项目下启动一个 Maven 实例

```sh
$ docker run -it --rm -v $HOME/.m2/:/root/.m2/ -v $PWD:/mymaven -w /mymaven maven:3.8.6-eclipse-temurin-17-alpine mvn clean package
```

在 Docker 容器中部署 Elasticsearch

启动一个 Elasticsearch 实例

```sh
$ docker run -d -p 9200:9200 --name es -e "discovery.type=single-node" elasticsearch:8.3.2
```

在 Docker 容器中部署 Docker 私有仓库

启动一个 Docker 私有仓库实例

```sh
$ docker run -d -p 5000:5000 --name registry registry:2
```

在 Docker 容器中部署 ZooKeeper

启动一个 ZooKeeper 实例

```sh
$ docker run -d --name zookeeper zookeeper
```

在 Docker 容器中部署 Kafka

启动一个 Kafka 实例

提示

通过 Docker 网络 host 模式启动以下实例。不然远程连接会报 java.net.UnknownHostException: 不知道这样的主机。 (aff96a366c15) 异常。

  1. 启动 Zookeeper 服务实例

    sh
    $ docker run -d --network host --name zookeeper zookeeper
  2. 启动 Kafka 服务实例

    sh
    $ docker run -d -p 9092:9092 --network host --name kafka -e ALLOW_PLAINTEXT_LISTENER=yes -e KAFKA_CFG_ZOOKEEPER_CONNECT=localhost:2181 bitnami/kafka
  3. 启动 Kafka Web UI 实例(可选)

    sh
    $ docker run -d -p 9000:9000 --network host --name kafka-web-ui -e KAFKA_BROKERCONNECT=localhost:9092 obsidiandynamics/kafdrop

在 Docker 容器中部署 RabbitMQ

启动一个 RabbitMQ 实例

```sh
$ docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:3-management
```

在 Docker 容器中部署 SkyWalking

启动一个 SkyWalking 实例

  1. 启动 SkyWalking 服务实例

    sh
    $ docker run -d -p 11800:11800 -p 12800:12800 --network host --name skywalking apache/skywalking-oap-server:9.4.0
  2. 启动 SkyWalking UI 服务实例

    sh
    $ docker run -d -p 8080:8080 --network host --name skywalking-ui -e SW_OAP_ADDRESS=http://localhost:12800 apache/skywalking-ui:9.4.0

Released under the MIT License.